package dancereal;

import java.util.ArrayList;
import java.util.List;

public class J04_Collection {
	/* 콜렉션 Collection
	 * 객체지향 기반 프로그램 작성시
	 * 종종 같은 종류의 객체의 묶음 group 이나
	 * 다른 종류의 객체묶음과 함께 쓰는 때가 있음
	 * 
	 * 앞서 배운 배열은 같은 종류의 객체 묶음이지만
	 * 유연성이 부족하고, 크기 조정도 안되고
	 * 다른종류의 객체도 가질 수 없음
	 * 
	 * 다행히 자바에는 이러한 종류의 객체를 쉽게
	 * 다룰 수 있는 인터페이스와 클래스를 제공
	 * 그것은 바로 Collection 프레임워크임
	 *
	 * 'collection 은 다른 객체의 묶음을 의미'
	 * 또 다른 말로 용기 container 라고도 하는데,
	 * 각 요소를 저장, 검색, 조작 하는 메서드를 제공
	 * 
	 * Collection <- Set, List, Queue
	 * List <- ArrayList, Vector (동적배열)
	 * Map <- AbstractMap, SortedMap
	 * AbstractMap <- HashMap (빠른검색)
	 * Iterator, Comparator 
	 * 
	 * 이들 대부분은 java.util 패키지에 포함됨
	 * 
	 * List - 동적배열
	 * Collection 의 가장 인기있는 하위 인터페이스임
	 * ArrayList는 List 의 가장 자주 사용하는 구현클래스
	 * List 는 자료를 순서대로 저장하는 특성을 가짐
	 * FIFO : first in first out 선입선출
	 * 또한, 데이터를 중복으로 저장 가능
	 * 단, Set 은 중복 허용 불가!  
	 * add 메서드를 통해 데이터를 List 의 맨끝에 추가
	 * 
	 * 지네릭 Generic
	 * collection 을 배울때 generic 을 빼놓으면
	 * 불완전하게 collection 을 배우는 것임
	 * collection 을 사용할때 발생할 수 있는
	 * 컴파일 시간때 엄격한 자료형 검사를 지원
	 * 또한, collection 을 다룰때 대부분의
	 * down casting 을 제거하고 사용할 수 있음
	 * 또한, C++에서 제공하는 클래스 템플릿 기능도
	 * 작성할 수 있게 해줌(고급)
	 * 
	 * 지네릭에서는 
	 * 매개변수 자료형 parameterized type 을 이용해서
	 * collection 요소의 자료형을 지정함
	 * 메서드의 매개변수와 비슷하게
	 * collection 에서는 <>를 매개변수자료형을 사용
	 * List<String> result = null;
	 * 
	 */
	
	public static void main (String[] args){
		List a = new ArrayList();
		a.add(123456); 
		a.add('수');
		a.add(123.456);
		a.add("김태희");
		a.add(new J03_MemberVO());
		System.out.println(a);
		
	/* ArrayList에 저장된 객체를 하나씩 꺼내 출력
	 * 변수에 따로 저장
	 * 이유 : ArrayList에 객체를 저장할때는
	 * 대상이 무엇이든 간에 무조건 Object 형으로
	 * 저장됨. 따라서, ArrayList에 저장된 객체를
	 * 꺼낼때는 객체의 자료형에 맞춰 
	 * down casting 이 필요(JDK 5 이전)
	 */ 
	 
	int num = (int)a.get(0);
	char cha = (char)a.get(1);
	float flo = (float)a.get(2);
	String str = (String)a.get(3);
	
	// 하지만, 이렇게 해도 일단 컴파일 오류는 X
	// 실행하면 비로소 오류가 표시됨
	// 이런 종류의 오류는 찾기 힘듦
	
	char num2 = (char)a.get(0); //String
	Integer intg = (Integer)a.get(3); //i n t	

	// 지네릭을 사용했을 경우
	List<String> abc = new ArrayList<String>();
	//List<String> abc = new ArrayList<>(); <- JDK 1.7
	//abc 라는 콜렉션(동적배열)에는
	//String 형식의 값만 추가할 수 있다는 의미
	
	//abc.add(123); <- 자료형 검사후 오류 표시	
	//abc.add('a');
	abc.add("김태희"); //정상출력
	
	String xyz = abc.get(0); // 형변환은 필요X
	
	List<J03_MemberVO> results =
			new ArrayList<J03_MemberVO>(); 
			//J03_MemberVO만 추가 가능하다는 의미
			
	
	
	/*
	 System.out.println(a.get(0));
	 System.out.println(a.get(1));
	 System.out.println(a.get(2));
	 System.out.println(a.get(3));
	 System.out.println(a.get(4));
	 */
	 
	}
}